/***********************************************************************
 * Module:  BaseWriter.java
 * Author:  juny
 * Created: 2006年7月14日 9:23:22
 * Purpose: Defines the Class BaseWriter
 ***********************************************************************/

package com.powerunion.datacollection.report.excelreport.base;

import java.util.Map;

import org.apache.log4j.Logger;

import com.powerunion.datacollection.report.excelreport.base.element.Templet;
import com.powerunion.datacollection.report.excelreport.config.ReportConfig.SheetConfig;

import jxl.Range;
import jxl.write.WritableImage;
import jxl.write.WritableSheet;

public abstract class BaseReportWriter implements IReportWriter {
    private static Logger log = Logger.getLogger(BaseReportWriter.class);
    
    /* 
     * @see excel.report.util.IWriter#analysisTemplet(jxl.write.WritableSheet)
     */
    public abstract void analysisTemplet(WritableSheet sheet) throws Exception;

    /* 
     * @see excel.report.util.IWriter#writeData(excel.report.util.Parameter)
     */
    public abstract void writeData(Parameter param) throws Exception ;
    
    public void setReportConfig(SheetConfig sheetConfig){
        this.sheetConfig = sheetConfig;
    }
    
    protected SheetConfig sheetConfig = null;
    private ITempletContainer container = null;
    
    /* (non-Javadoc)
     * @see excel.report.util.IWriter#setDataSources(java.util.Map)
     */
    public void setDataSources(Map dataSources) {
       this.dataSources = dataSources;
    }

    /* (non-Javadoc)
     * @see excel.report.util.IWriter#setParameters(java.util.Map)
     */
    public void setParameters(Map params) {
        this.params = params;
    }
    
    /**
     * 读取模板组内的其他信息,如组内包含的图片信息,超链接信息,
     * 合并单元格信息等,因为这些信息不能通过单个单元格的拷贝操作
     * 来拷贝,只能标识出来一个一个手动拷贝.
     * @param sheet
     */
    protected void getMergedCells(WritableSheet sheet){
        Range[] mergedCells = sheet.getMergedCells();
        
        //不存在合并单元格则退出.
        if(mergedCells.length <= 0) return;
        
        for(int i=0; i<mergedCells.length; i++){
            container.addMergedCell(mergedCells[i]);
        }
    }
    
    /**
     * 读取模板组内图片信息，并将图片信息装入到相应的容器中去。
     * @param sheet 模板sheet
     */
    protected void getImages(WritableSheet sheet){
    	//拷贝图象
        int images = sheet.getNumberOfImages();
        for(int i=0; i<images; i++){
            WritableImage img = sheet.getImage(i);
            container.addImage(img);
        }
    }
    
    /**
     * 取得报表的顶层模板容器对象。
     * @return ITempletContainer
     */
    protected ITempletContainer getContainer(){
        if(null == container){
            //在报表中的顶层container容器未null
            container = new Templet(null);  
        }
        return container;
    }
    
    /**
     * 删除模板数据
     * @param param
     */
    protected void deleteTemplet(Parameter param){
        int beginRow = this.container.getBeginRow() + 1;
        int endRow = this.container.getEndRow();
        
        //此处不能从结束行开始删除,否则保存数据时会出现合并错误的单元格.
        for (int i = beginRow; i < endRow; i++) {
            param.sheet.removeRow(beginRow);
        }
    }
    
    /**
     * 删除报表中包含的模板图片对象。
     * @param param
     */
    protected void deleteAllTempletImages(Parameter param){
        this.container.removeAllTempletImages(param.sheet);
    }
    
    /**
     * 取得指定行列是否存在合并的单元格，如果存在则返回合并单元格的区域。
     * @param sheet		模板文件
     * @param col		指定列
     * @param row		指定行
     * @return			null 在指定行列位置没有合并单元格
     * 					非null 返回Range对象
     */
    protected Range getCellRange(WritableSheet sheet, int col, int row){
        Range[] mergedCells = sheet.getMergedCells();
        
        //不存在合并单元格则退出.
        if(mergedCells.length <= 0) return null;
        
        for(int i=0; i<mergedCells.length; i++){
            if(mergedCells[i].getTopLeft().getColumn() == col &&
                    mergedCells[i].getTopLeft().getRow() == row){
                return mergedCells[i];
            }
        }
        return null;
    }
    
    protected Map params = null;
    protected Map dataSources = null;
    
}